package com.kylin.common.security.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.CompressionCodecs;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.Objects;

/**
 * jwt工具类
 * @author wuhao
 * @version 1.0 - 2022/8/15
 */
public class JwtUtils {

    /** 默认有效期：24小时 */
    private static final long TOKEN_EXPIRATION = 24 * 60 * 60 * 1000L;
    /** 设置密钥明文 */
    private static final String TOKEN_KEY = "123456";

    private JwtUtils() {
        throw new IllegalStateException("Utility class");
    }

    /**
     * 生成token
     * @param subject 登录用户数据
     * @return
     * @author wuhao
     * @since 2.6.0 - 2022/8/22
     */
    public static String createJwt(String subject) {
        return Jwts.builder()
                // 负载
                .setSubject(subject)
                // 签发日期
                .setIssuedAt(new Date())
                // 签发者
                .setIssuer("kylin")
                // 过期时间
                .setExpiration(new Date(System.currentTimeMillis() + TOKEN_EXPIRATION))
                // 签名
                .signWith(SignatureAlgorithm.HS512, TOKEN_KEY)
                .compressWith(CompressionCodecs.GZIP)
                .compact();
    }

    /**
     * 生成token
     * @param subject 登录用户数据
     * @param expireTimes 过期时间,单位：秒
     * @return
     * @author wuhao
     * @since 2.6.0 - 2022/8/22
     */
    public static String createJwt(String subject, long expireTimes) {
        if(Objects.isNull(expireTimes)) {
            expireTimes = TOKEN_EXPIRATION;
        }
        return Jwts.builder()
                // 负载
                .setSubject(subject)
                // 签发日期
                .setIssuedAt(new Date())
                // 签发者
                .setIssuer("kylin")
                // 过期时间
                .setExpiration(new Date(System.currentTimeMillis() + expireTimes * 1000))
                // 签名
                .signWith(SignatureAlgorithm.HS512, TOKEN_KEY)
                .compressWith(CompressionCodecs.GZIP)
                .compact();
    }

    /**
     * 解析jwt
     * @param token 登录token
     * @return
     * @author wuhao
     * @since 2.6.0 - 2022/10/9
     */
    public static Claims parseJwt(String token) {
        return Jwts.parser()
                .setSigningKey(TOKEN_KEY)
                .parseClaimsJws(token)
                .getBody();
    }

}
